package com.ma.tools;

import org.springframework.ai.chat.model.ToolContext;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Map;

@Component
public class AITools {

    /**
     * 获取当前日期时间（用户时区）
     */
    @Tool(description = "获取用户当前时区的日期时间，返回 ISO-8601 字符串")
    public String getCurrentDateTime() {
        String dateTime = LocalDateTime.now()
                .atZone(LocaleContextHolder.getTimeZone().toZoneId())
                .toString();
        System.out.println("获取当前日期时间：" + dateTime);
        return dateTime;
    }

    /**
     * 查询库存信息
     */
    @Tool(description = "根据商品 ID 查询库存数量")
    public int queryStock(
            @ToolParam(description = "商品编号", required = true) String productId) {
        // 模拟查询：实际应调用你自己的库存服务或数据库
        // 这里硬编码模拟：如果 productId = "P123" 返回 100，其它返回 0
        System.out.println("查询库存：" + productId);
        if ("P123".equals(productId)) {
            return 100;
        } else {
            return 0;
        }
    }

    /**
     * 下单动作工具
     */
    @Tool(description = "为用户下单指定商品并数量，返回订单号", returnDirect = true)
    public Map<String, Object> placeOrder(
            @ToolParam(description = "用户编号", required = true) String userId,
            @ToolParam(description = "商品编号", required = true) String productId,
            @ToolParam(description = "下单数量", required = true) int quantity) {
        // 模拟动作：在实际系统中调用下单服务
        String orderNo = "ORD" + System.currentTimeMillis();
        System.out.printf("下单动作：用户 %s 为商品 %s 下单 %d 件，生成订单号：%s%n",
                userId, productId, quantity, orderNo);
        // 模拟返回订单信息
        return Map.of(
                "userId", userId,
                "productId", productId,
                "quantity", quantity,
                "orderNo", orderNo
        );
    }

    /**
     * 获取用户资料信息（带上下文）
     */
    @Tool(description = "根据用户编号获取用户资料，支持工具上下文获取租户信息")
    public Map<String, Object> getUserProfile(
            @ToolParam(description = "用户编号", required = true) String userId,
            ToolContext context) {
        String tenantId = (String) context.getContext().get("tenantId");
        System.out.println("获取用户资料：" + userId + "，租户：" + tenantId);
        // 模拟返回用户资料
        return Map.of(
                "userId", userId,
                "tenantId", tenantId,
                "name", "张三",
                "vip", true
        );
    }
}
